package ar.com.hjg.pngj;

/**
 * General format-translated image line.
 * <p>
 * The methods from this interface provides translation from/to PNG raw unfiltered pixel data, for each image line. This doesn't make any assumptions of underlying storage.
 * <p>
 * The user of this library will not normally use this methods, but instead will cast to a more concrete implementation, as {@link ImageLineInt} or {@link ImageLineByte} with its
 * methods for accessing the pixel values.
 */
public interface IImageLine {

  /**
   * Extract pixels from a raw unlfilterd PNG row. Len is the total amount of bytes in the array, including the first byte (filter type)
   * 
   * Arguments offset and step (0 and 1 for non interlaced) are in PIXELS. It's guaranteed that when step==1 then offset=0
   * 
   * Notice that when step!=1 the data is partial, this method will be called several times
   * 
   * Warning: the data in array 'raw' starts at position 0 and has 'len' consecutive bytes. 'offset' and 'step' refer to the pixels in destination
   */
  void readFromPngRaw(byte[] raw, int len, int offset, int step);

  /**
   * This is called when the read for the line has been completed (eg for interlaced). It's called exactly once for each line. This is provided in case the class needs to to some
   * postprocessing.
   */
  void endReadFromPngRaw();

  /**
   * Writes the line to a PNG raw byte array, in the unfiltered PNG format Notice that the first byte is the filter type, you should write it only if you know it.
   * 
   */
  void writeToPngRaw(byte[] raw);

}
